#ifndef BBOX_H_
#define BBOX_H_

#include "Vec3.h"
class Ray;

class BBox
{
public:
    BBox() : m_minX(0.0f),m_minY(0.0f),m_minZ(0.0f),
             m_maxX(0.0f),m_maxY(0.0f),m_maxZ(0.0f) {}
    BBox(float x0,float y0,float z0,float x1,float y1,float z1): 
        m_minX(x0),m_minY(y0),m_minZ(z0),
        m_maxX(x1),m_maxY(y1),m_maxZ(z1) {}
    BBox(const Vec3& min, const Vec3& max) :
        m_minX(min.m_x),m_minY(min.m_y),m_minZ(min.m_z),
        m_maxX(max.m_x),m_maxY(max.m_y),m_maxZ(max.m_z) {}
    ~BBox(){}
    virtual bool Hit(const Ray& ray) const;
    void CreateFromPosAndHalf(const Vec3& pos, const Vec3& half)
    {
        m_minX = pos.m_x - half.m_x;
        m_minY = pos.m_y - half.m_y;
        m_minZ = pos.m_z - half.m_z;

        m_maxX = pos.m_x + half.m_x;
        m_maxY = pos.m_y + half.m_y;
        m_maxZ = pos.m_z + half.m_z;
    }
    void SetValues(float x0,float y0,float z0,float x1,float y1,float z1)
    {
        m_minX = x0; m_minY = y0; m_minZ = z0;
        m_maxX = x1; m_maxY = y1; m_maxZ = z1;
    }
    bool IsVectorInside(const Vec3& v) const
    {
        return ((v.m_x > m_minX && v.m_x < m_maxX) && 
                (v.m_y > m_minY && v.m_y < m_maxY) && 
                (v.m_z > m_minZ && v.m_z < m_maxZ));
    }
public: //accesible in GRID later on
    float m_minX,m_minY,m_minZ;
    float m_maxX,m_maxY,m_maxZ;
};

#endif